/**
 * @file RTC.c
 * @brief 实时时钟驱动文件
 * @details 实现RTC时钟的初始化、时间获取和格式化显示等功能
 * @author 开发者
 * @date 创建日期
 */

#include "RTC.h"

/**
 * @brief RTC初始化函数
 * @details 配置RTC时钟源、预分频器，设置初始时间
 */
void rtc_Init(void) {
    rcu_periph_clock_enable(RCU_PMU);      // 使能电源管理单元时钟
    pmu_backup_write_enable();             // 使能备份域写操作
    rcu_osci_on(RCU_LXTAL);                // 开启外部低速晶振
    rcu_osci_stab_wait(RCU_LXTAL);         // 等待外部低速晶振稳定
    rcu_rtc_clock_config(RCU_RTCSRC_LXTAL); // 配置RTC时钟源为外部低速晶振
    rcu_periph_clock_enable(RCU_RTC);      // 使能RTC时钟
    rtc_register_sync_wait();              // 等待RTC寄存器同步

    /* 检查备份寄存器，如果未初始化则设置默认时间 */
    if(RTC_BKP0 != 0xf234) {
        RTC_BKP0 = 0xf234;                 // 设置备份寄存器标志
        rtc_parameter_struct rps;          // RTC参数结构体
        
        /* 设置默认时间：2025年7月19日 11:35:00 */
        rps.year = 0x25;                   // 年份（BCD格式）
        rps.month = 0x07;                  // 月份（BCD格式）
        rps.date = 0x19;                   // 日期（BCD格式）
        rps.day_of_week = 0x04;            // 星期（周四）
        rps.hour = 0x11;                   // 小时（BCD格式）
        rps.minute = 0x35;                 // 分钟（BCD格式）
        rps.second = 0x00;                 // 秒（BCD格式）
        rps.display_format = RTC_24HOUR;   // 24小时制显示格式
        rps.am_pm = RTC_PM;                // 下午

        rps.factor_asyn = 127;   // 7位异步预分频器，0x0 - 0x7F
        rps.factor_syn  = 249;   // 15位同步预分频器，0x0 - 0x7FFF
        rtc_init(&rps);          // 初始化RTC
    }


}

/**
 * @brief 获取RTC时间并格式化显示
 * @param YMD 年月日输出缓冲区
 * @param HMS 时分秒输出缓冲区
 * @details 从RTC读取当前时间，格式化为字符串显示
 */
void rtc_get_time(char * YMD, char * HMS) {
    rtc_parameter_struct rps;              // RTC参数结构体
    rtc_current_time_get(&rps);           // 获取当前RTC时间

    /* 从BCD格式转换为十进制 */
    uint16_t year = READ_BCD(rps.year) + 2000;  // 年份（加2000年）
    uint8_t month = READ_BCD(rps.month);        // 月份
    uint8_t date = READ_BCD(rps.date);          // 日期
    uint8_t week = READ_BCD(rps.day_of_week);   // 星期
    uint8_t hour = READ_BCD(rps.hour);          // 小时
    uint8_t minute = READ_BCD(rps.minute);      // 分钟
    uint8_t second = READ_BCD(rps.second);      // 秒

#ifdef RTC_DEBUG
    printf("%d-%d-%d %d %d:%d:%d\r\n", year, month, date, week, hour, minute, second);
#endif

    /* 格式化年月日字符串 */
    sprintf(YMD,"%d-%02d-%02d",year,month,date);  // 格式：YYYY-MM-DD
#ifdef RTC_DEBUG
    printf("%s \n",YMD);
#endif

    /* 格式化时分秒字符串 */
    sprintf(HMS,"%d:%02d:%02d",hour,minute,second);  // 格式：HH:MM:SS
#ifdef RTC_DEBUG
    printf("%s \n",HMS);
#endif
}

